#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main(int argc, const char *argv[])
{
    // 打开文件
    //以读写方式打开文件，如果文件不存在则创建文件
    //如果文件存在，将原有文件清空
    int fd = 0;
    if (-1 == (fd = open("hello.txt", O_RDWR | O_CREAT | O_TRUNC, 0666)))
    {
        perror("文件打开失败\n");
        return 0;
    }
    printf("文件打开成功,fd = %d\n", fd);

    //给文件进行加锁
    //定义一个锁的结构体
    struct flock lock;
    lock.l_type = F_WRLCK;//写锁
    lock.l_whence = SEEK_SET;//从文件开始的位置进行加锁
    lock.l_start = 0;//从文件的开头进行加锁
    lock.l_len = 0;//加锁长度为0，直接加到文件末尾 
    if(-1 == fcntl(fd,F_SETLK,&lock))
    {
        perror("加锁失败\n");
        return -1;
    }
    printf("加锁成功\n");
    //加锁是针对其他进程而言的，是其他进程不能忘文件中写入内容
    //但是对于自身进程而言，是可以往文件中进行写内容的
    //因为fcntl函数是建议性，不是强制性的
    //给文件写入内容
    char *str = "hello world";
    ssize_t ret = 0;
    if(-1 == (ret = write(fd,str,strlen(str))))
    {
        perror("写入失败\n");
        return -1;
    }
    printf("写入成功\n");
    //给文件进行解锁
    lock.l_type = F_UNLCK;
    if(-1 == fcntl(fd,F_UNLCK,&lock))
    {
        perror("解锁失败\n");
    }
    printf("解锁成功\n");
    //关闭文件
    close(fd);
    return 0;
}